package com.xuan.friend.elasticsearch;


import com.xuan.friend.domain.question.es.QuestionES;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository                                                     // elasticsearch 对应的实体, 主键id类型
public interface QuestionRepository extends ElasticsearchRepository<QuestionES, Long> {

    // 根据难度查询
    public Page<QuestionES> findByDifficulty(Integer difficulty, Pageable pageable);

    // 根据 标题或内容 查询
    //  GET /idx_question/_search
    //    {
    //      "bool": {
    //        "should": [
    //          {
    //            "match": {
    //              "title": "?0"
    //            }
    //          },
    //          {
    //            "match": {
    //              "content": "?1"
    //            }
    //          }
    //        ],
    //        "minimum_should_match": 1
    //      }
    //    }
    @Query("{\"bool\": {\"should\": [{ \"match\": { \"title\": \"?0\" } }, { \"match\": { \"content\": \"?1\" } }], \"minimum_should_match\": 1}}")
    public Page<QuestionES> findByTitleOrContent(String title, String content,  Pageable pageable);

    // 根据 标题或内容 and 题目难度 查询
    // GET /idx_question/_search
    //{
    //  "bool": {
    //    "should": [
    //      {
    //        "match": {
    //          "title": "?0"
    //        }
    //      },
    //      {
    //        "match": {
    //          "content": "?1"
    //        }
    //      }
    //    ],
    //    "minimum_should_match": 1,
    //    "must": [
    //      {
    //        "term": {
    //          "difficulty": "?2"
    //        }
    //      }
    //    ]
    //  }
    //}
    @Query("{\"bool\": {\"should\": [{ \"match\": { \"title\": \"?0\" } }, { \"match\": { \"content\": \"?1\" } }], \"minimum_should_match\": 1, \"must\": [{\"term\": {\"difficulty\": \"?2\"}}]}}")
    public Page<QuestionES> findByTitleOrContentAndDifficulty(String title, String content, Integer difficulty, Pageable pageable);

    List<QuestionES> findByQuestionIdIn(List<Long> ids);

}
